package com.summer.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.summer.common.R;
import com.summer.entity.Category;
import com.summer.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@Slf4j
@RequestMapping("/category")
public class CategoryController {

    @Autowired
    private CategoryService categoryService;

    /**
     * 添加分类方法
     * @param category 用于获取json格式的分类数据
     * @return 返回成功信息
     */
    @PostMapping
    public R<String> addCategory(@RequestBody Category category){
        log.info("正在执行新增分类方法, 参数信息为：{}", category.toString());
        //1. 封装category对象 --其他属性已自动生成，不需要封装
        //2. 调用service层新增方法
        categoryService.save(category);
        //3. 异常处理 --交给全局异常处理器（唯一值异常、数据范围超出异常）
        //4. 返回添加成功信息
        return R.success("已成功添加！");
    }

    /**
     * 分页查询分类方法
     * @param page 获取当前页数
     * @param pageSize 获取当前显示数
     * @return 返回R<Page>
     */
    @GetMapping("/page")
    public R<Page<Category>> getByPage(Long page, Long pageSize){
        log.info("请求[分类分页查询], 请求参数信息：page=" + page + "pageSize=" +pageSize );
        // 1. 使用分页查询API封装查询结果
        Page<Category> categoryPage = new Page<>(page, pageSize);
        // 2. 调用service层分页查询方法
        // 封装条件查询构造器, 按type和sort排序
        LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.orderByAsc(Category::getType, Category::getSort);
        categoryService.page(categoryPage,queryWrapper);
        // 3. 异常处理 -- 无
        // 4. 返回R<Page>
        return R.success(categoryPage);
    }

    /**
     * 根据id删除分类
     * @param ids 获取分类id
     * @return 返回成功信息
     */
    @DeleteMapping
    public R<String> deleteById(Long ids){

        log.info("请求删除分类，参数id为：{}", ids);
        //1. 调用service层删除功能， 根据业务需求已在业务层重写此方法
        categoryService.removeById(ids);
        //2. 异常处理  TODO 对于不成功的操作：
        //                     优秀思想：在业务层抛出自定义异常，全局处理器捕获并返回失败信息。
        //                        优点：
        //                          符合AOP开发，简化业务逻辑
        //                          扩展性强，自定义异常类有时可用于其他业务
        //                     一般思想：在业务层返回false，在控制层返回失败信息。只能用于此业务
        //3. 条件构造器 --无
        //4. 返回删除成功信息
        return R.success("删除成功！");
    }

    /**
     * 修改分类信息
     * @param category 接收分类数据
     * @return 返回修改成功信息
     */
    @PutMapping
    public R<String> updateCategory(@RequestBody Category category){
        log.info("请求更新分类操作，分类信息为：{}",category.toString());
        // 1. 补充封装分类数据 -更新语句不需要补充（TODO update语句默认跳过更新属性值为null的值）
        // 2. 条件构造器 --无
        // 3. 调用service层修改方法
        categoryService.updateById(category);
        // 4. 异常处理
        // 5. 返回修改成功信息
        return R.success("修改成功");
    }

    /**
     * 根据分类类型获取分类数据
     * @param type 获取分类类型，1表示菜品， 2表示套餐
     * @return 返回分类列表数据
     */
    @GetMapping("/list")
    public R<List<Category>> getCategoriesByType(Integer type){

        log.info("根据分类类型查询菜品：type={}", type);
        //1. 查询条件构造器
        LambdaQueryWrapper<Category> lqw = new LambdaQueryWrapper<>();
        lqw.eq(type!=null, Category::getType, type);
        lqw.orderByAsc(Category::getType).orderByDesc(Category::getUpdateTime);
        //2. 调用service查询
        List<Category> categoryList = categoryService.list(lqw);
        //3. 异常处理 -无
        //4. 返回R<列表数据>
        return R.success(categoryList);

    }


}
